Script V2 zur März 2021 Update-Bereinigung bei Druckproblemen

Windows Update[English]Blog-Leser bon-go hat mir sein überarbeitetes PowerShell-Script zugeschickt, um die problematischen Updates vom März 2021, die die hier im Blog berichteten Druckprobleme verursachen, in Windows 10 deinstallieren. Ich stelle die aktualisierte Version des Scripts hier im Blog ein – vielleicht ist es für jemanden von Interesse.


Anzeige

Kurzer Rückblick

Mit den Windows-Sicherheitsupdates vom 9. März 2021 wurden einerseits zahlreiche Schwachstellen im Betriebssystem geschlossen. Benutzer berichteten aber kurz nach Installation der Sicherheitsupdates von erheblichen Druckproblemen.

Was folgte, war eine Update-Orgie, die so manches verschlimmbesserte. Vor allem war die Installation der Korrekturupdates immer mit dem Risiko verbunden, dass irgend etwas schief lief. Als Reaktion auf meinen Blog-Beitrag Windows 7/8.1/Server: Korrektur-Updates für Druckprobleme (März 2021) hat Andy in diesem Kommentar angeboten, sein PowerShell-Script zur Bereinigung des Systems von den problematischen Updates allgemein bereitzustellen. Ich hatte das PowerShell_Script im Blog-Beitrag Druckerprobleme März 2021: PowerShell-Script zur Update-Bereinigung veröffentlicht.

Aktualisiertes Script

In diesem Kommentar weist Blog-Leser bon-go auf seine neue Version des Scripts hin. Denn es gab auf manchen Windows-Systemen Probleme. Dazu schrieb mir der Leser per Mail noch folgende Zeilen.

das original Skript hat bei uns größtenteils gut funktioniert – aber abhängig von der Windows Version nicht überall und nicht silent. Anbei die aktualisierte Version für diese und ähnliche Probleme.

Hinweis: das ist ein Batch Skript was Powershell startet, also als cmd speichern.

Das Skript läuft einmal durch und eventuell zu deinstallierende problematische Updates müssen jeweils einmalig noch mit 'OK' deinstalliert werden (wusa mit dem Parameter quiet oder dism funktioniert nicht überall, es wird auch versucht das Update gleich auszublenden, funktioniert eher selten – nur bei kleineren Updates).

Danach wie angezeigt den PC neu starten.

Nach dem PC Neustart das Skript erneut ausführen, alles läuft wieder wie zuvor. Wenn jetzt das gleiche Update wieder versucht wird zu deinstallieren ist es eine Endlosschleife, ein Timing Problem beim de- und installieren.

Normalerweise aber findet das Skript die zuvor deinstallierten problematischen Updates und versteckt die, das wird auch angezeigt.

Wenn das Verstecken mal nicht ausgeführt wird (keine gelbe Zeile / keine Anzeige) dann:
– wurde das Update zurückgezogen
– braucht der PC ein klein wenig länger bis er das erneut finden will
(Skript nochmal nach 1-2 min. starten)

Viel Spass …

Klingt vielversprechend. Das Script ist mir als E-Mail zugegangen – hier die Fassung, die man per Zwischenablage in einen Editor übertragen und dann als Batchdatei (.cmd) speichern kann.


Anzeige

;@echo off & setlocal & set localfname=%~f0
;Findstr -rbv ; %0 | powershell -c -
;goto:BatchExit

# entfernt die Windows Updates aus 03/2021 welche Druckerprobleme 
#   verursachen, Stand 23.03.2021 'gegen Mittag', siehe auch 
#   https://www.borncity.com/blog/2021/03/22/windows-10-mrz-2021-update-erneut-freigegeben/

#
# dieses Batch + Powershell Skript entfernt diverse Updates anhand der 
#   Bezeichnung / KB Nummern und blendet diese dauerhaft aus, 
#   das Skript benoetigt lokale Administratorrechte, es fragt diese an
#
# wenn das Skript einmal durchgelaufen ist und dabei zu entfernende 
#   Updates gefunden wurden, dann unbedingt den Computer neu starten und 
#   direkt nach dem Neustart das Skript noch einmal laufen lassen, erst 
#   dabei werden tlw. die letzten auszublendenen Updates wirklich 
#   verschwinden
#
# wenn auch nach mehrmaligem Aufruf immer wieder (die gleichen) Updates 
#   deinstalliert werden dann manuell eingreifen, den Windows Update 
#   Cache lokal loeschen (Skript 02WindowsUpdatesLöschen.cmd), die 
#    Updates manuell deinstallieren und (wenn ueberhaupt moeglich) 
#    manuell ausblenden (mit wushowhide.diagcab)
#
# diverse Teile des Skriptes sind nur verschlimmbessert und wurden 
#   schamlos kopiert von:
#   https://www.powershellmagazine.com/2014/03/19/how-to-view-and-restore-hidden-windows-updates-with-powershell/


# die problematischen Updates / KB Nummern (_ohne_ die Bezeichnung 'KB') die entfernt und ausgeblendet werden sollen
$HotFixesToRemove=@("5000802", "5000808", "5000822", "5000809", "5000812", "5000803", "5000807", "5001567", "5001566", "5001568", "5001565")

Function Main {
    [Cmdletbinding()]
    Param()
    Process {
        # teste ob das Skript als Administrator ausgefuehrt wurde, wenn nicht dann versuche Neustart mit erhoehten Rechten
        CheckAndRaiseElevation
        
        # entferne die problematischen Updates
        If( RemoveWrongHotfixes ) {
            Write-Host "Es wurde mind. ein Windows Update gefunden welches deinstalliert wurde."
            Write-Host "Bitte warten, sammle Informationen ueber noch ausstehende Updates ..."
            HideWrongHotfixes
            Write-Host "Die zuvor deinstallierten Windows Updates wurden soweit moeglich ausgeblendet."
            Write-Host "Bitte umgehend den Computer neu starten und direkt nach dem Start das Programm"
            Write-Host "erneut ausfuehren."
            Write-Host "Im Fall einer Endlosschleife (falls dies schon mehrfach gemacht wurde und diese"
            Write-Host "Meldung immer wieder erscheint dann die Deinstallation und das Ausblenden"
            Write-Host "manuell durchfuehren."
            waitkey "Weiter mit beliebiger Taste, danach manuell neu starten [x]" | Out-Null
        } Else {
            # es konnte keines der problmatisches Updates mehr deinstalliert werden, versuche die zu finden 
            # mit der try-and-error-methode dauerhaft auszublenden
            Write-Host "Es ist keines der problematischen Updates installiert."
            Write-Host "Bitte warten, sammle Informationen ueber noch ausstehende Updates ..."
            HideWrongHotfixes
            Write-Host "Die zuvor deinstallierten Windows Updates wurden soweit moeglich ausgeblendet."
            WaitKey "Das Programm kann beendet werden, weiter mit beliebiger Taste [x]" | Out-Null
        }
    }
}


Function WaitKey($___text){
    Write-Host $___text
    $___x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-Null
    Return $___x
}

Function CheckAndRaiseElevation {
    [Cmdletbinding()]
    Param()
    Process {
        # Test ob mit genug Rechten gestartet
        $IsElevated=([System.Security.Principal.WindowsPrincipal][System.Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)

        If( -not $IsElevated ) {
            Write-Host "Das Programm hat zu wenig Rechte: erhoehe Rechte."
            Try {
                # versuche das Batch Skript erneut mit lokalen Administratorrechten zu starten
                Start-Process -FilePath $env:localfname -Verb RunAs -ErrorAction SilentlyContinue
            }
            Catch {
                Write-Host "Der Benutzer hat die Erhoehung der Rechte verweigert - Abbruch!"
                WaitKey "Ende mit beliebiger Taste [x]" | Out-Null
            }
            Exit
        }
        # Write-Host "Programm laeuft aktuell mit Administrator Rechten."
        # wechsle in den urspr. Programmpfad wenn geht, auch UNC und gemappte Netzlaufwerke moeglich
        Set-Location $(Split-Path -Parent $env:localfname)
    }
}

# entfernt wenn möglich alle als Parameter angegebenen problematischen Hotfixes 
Function RemoveWrongHotfixes {
    [Cmdletbinding()]
    Param()
    Process {
        $ReturnVal=$False
        $InstalledHotFixes=$(Get-WmiObject -Class win32_quickfixengineering).HotFixID
        Write-Host "Ueberpruefe alle installierten Updates"
        Foreach( $InstalledHotFix in $InstalledHotFixes ) {
            Foreach($HotFixToRemove in $HotFixesToRemove) {
                If( $InstalledHotFix -match "$HotFixToRemove") {
                    Write-Host "Das Update $InstalledHotFix wird entfernt"            
                    Start-Process -FilePath "wusa.exe" -Argumentlist "/Uninstall /KB:$HotFixToRemove /norestart" -PassThru -Wait | Out-Null
                    $ReturnVal=$true
                }
            }    
        }
        Return $ReturnVal
    }
}


# versteckt wenn moeglich problematischen Hotfixes 
Function HideWrongHotfixes {
    [Cmdletbinding()]
    Param()
    Process {
        SearchForWindowsUpdates
        $ActUpdates=Get-WindowsUpdate
        Foreach( $ActUpdate in $ActUpdates ) {
            Foreach($HotFixToRemove in $HotFixesToRemove) {
                If( $ActUpdate.Title -match "$HotFixToRemove") {
                    Write-Host "Das Update $($ActUpdate.Title) wird entfernt"            
                    Set-WindowsHiddenUpdate $ActUpdate -Hide $True -Verbose
                }
            }    
        }
    }
}    

Function Get-WindowsUpdate {
    [Cmdletbinding()]
    Param()
    Process {
        Try {
            Write-Verbose "Abfrage aller Windows Updates"
            $Session = New-Object -ComObject Microsoft.Update.Session
            $Searcher = $Session.CreateUpdateSearcher()
            $Criteria = "IsInstalled=0 and DeploymentAction='Installation' or IsPresent=1 and DeploymentAction='Uninstallation' or IsInstalled=1 and DeploymentAction='Installation' and RebootRequired=1 or IsInstalled=0 and DeploymentAction='Uninstallation' and RebootRequired=1"
            $SearchResult = $Searcher.Search($Criteria)
            $SearchResult.Updates
        } Catch {
            Write-Warning -Message "Abfrage der Windows Updates fehlgeschlagen, Fehler $($_.Exception.Message)"
        }
    }
}

Function SearchForWindowsUpdates {
    [Cmdletbinding()]
    Param()
    Process {
        # Define update criteria
        $Criteria = "IsInstalled=0"

        # Search for relevant updates
        $Searcher = New-Object -ComObject Microsoft.Update.Searcher
        $SearchResult = $Searcher.Search($Criteria).Updates
    }
}    

Function SearchAndInstallWindowsUpdates {
    [Cmdletbinding()]
    Param()
    Process {
        # Define update criteria
        $Criteria = "IsInstalled=0"

        # Search for relevant updates
        $Searcher = New-Object -ComObject Microsoft.Update.Searcher
        $SearchResult = $Searcher.Search($Criteria).Updates

        # Download updates
        $Session = New-Object -ComObject Microsoft.Update.Session

        $Downloader = $Session.CreateUpdateDownloader()
        $Downloader.Updates = $SearchResult
        $Downloader.Download()

        $Installer = New-Object -ComObject Microsoft.Update.Installer
        $Installer.Updates = $SearchResult
        $Result = $Installer.Install()
        If ($Result.rebootRequired) { 
#            shutdown.exe /t 0 /r 
        }
    }
}

Function Remove-WindowsUpdate {
    [CmdletBinding()]  
    param (  
        [parameter(Mandatory=$True)] $RemoveKB
    )

    $Searcher = New-Object -ComObject Microsoft.Update.Searcher
    $RemoveCollection = New-Object -ComObject Microsoft.Update.UpdateColl

    # hole alle installierten Updates
    $SearchResult = $Searcher.Search("IsInstalled=1")

    # erzeuge Liste der zu loeschenden Updates wenn installiert
    $SearchResult.Updates | ? { $_.KBArticleIDs -in $RemoveKB } | % { $RemoveCollection.Add($_) }

    # loesche ...
    if ($RemoveCollection.Count -gt 0) {
        $Installer = New-Object -ComObject Microsoft.Update.Installer
        $Installer.Updates = $RemoveCollection
        $Installer.Uninstall()
    } else { 
        Write-Warning "No matching Windows Updates found for:`n$($RemoveKB|Out-String)" 
    }
}

# Bonus
Function Show-WindowsUpdate {
    Get-WindowsUpdate |
    Select Title,isHidden,
        @{l='Size (MB)';e={'{0:N2}' -f ($_.MaxDownloadSize/1MB)}},
        @{l='Published';e={$_.LastDeploymentChangeTime}} |
    Sort -Property Published
}

# 
# Show-WindowsUpdate 
# Show-WindowsUpdate | Where { $_.isHidden }| Out-GridView

Function Set-WindowsHiddenUpdate {
    [Cmdletbinding()]
    Param(
        [Parameter(ValueFromPipeline=$true,Mandatory=$true)]
        [System.__ComObject[]]$Update,
        [Parameter(Mandatory=$true)]
        [boolean]$Hide
    )
    Process {
        $Update | ForEach-Object -Process {
            if ((($_.pstypenames)[0] -eq 'System.__ComObject#{c1c2f21a-d2f4-4902-b5c6-8a081c19a890}') -or 
                (($_.pstypenames)[0] -eq 'System.__ComObject#{70cf5c82-8642-42bb-9dbc-0cfd263c6c4f}') -or 
                (($_.pstypenames)[0] -eq 'System.__ComObject#{918efd1e-b5d8-4c90-8540-aeb9bdc56f9d}')) {
                try {
                    $_.isHidden = $Hide
                    Write-Verbose -Message "Blende Update $($_.Title) aus"
                } catch {
                    Write-Warning -Message "Ausblenden des Windows Update fehlgeschlagen, Fehler $($_.Exception.Message)"
                }
            } else {
                Write-Warning -Message "Ignoriere uebergebenes Objekt"
            }
        }
    }
}

# Beispiel: verstecke alle noch offenene Updates
#   Get-WindowsUpdate | Set-WindowsHiddenUpdate -Hide:$true -Verbose
# Beispiel: verstecke alle noch offenene Definitionsupdates
#   Get-WindowsUpdate | Where { $_.Title -match 'Definitionsupdate' } | Set-WindowsHiddenUpdate -Hide:$false
# Beispiel: verstecke alle noch offenene sicherheitsupdates
#   Get-WindowsUpdate | Where { $_.Title -match 'Sicherheitsupdate' } | Set-WindowsHiddenUpdate -Hide:$false
# Beispiel: verstecke Browser Choice Updates
#   Get-WindowsUpdate | Where { $_.Title -match 'Microsoft Browser Choice Screen Update'} | Set-WindowsHiddenUpdate -Hide $true -Verbose


main


;:BatchExit
;REM Hinweis: dieses Ende des Batch Skriptes wird sofort ausgefuehrt, es wird nicht auf das Ende der Powershell gewartet!
;goto :eof

# Stand 22.03.2021
#
# Die Fehler sind / wurden wohl endgueltig mit folgendens Updates am 18.03 bzw. 22.03.2021 behoben
# KB5001642 für Windows Server 2008 SP2 x64 (ESU)
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows6.0-kb5001642-x64_4ae1b3c5cebedcd27fe50add6a34e70a00d19b76.msu
# KB5001639 für Windows 7 SP1 x86  (ESU)
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows6.1-kb5001639-x86_f7571200399e9c1099c37cc78c5b0a5481259989.msu
# KB5001639 für Windows 7 SP1 x64  (ESU)
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows6.1-kb5001639-x64_de64f5cb314e3eac59bb3c4371c9ba802adf0f22.msu
# KB5001639 für Windows Server 2008 R2 (ESU)
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows6.1-kb5001639-x64_de64f5cb314e3eac59bb3c4371c9ba802adf0f22.msu
# KB5001641 für Windows Server 2012 x64
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows8-rt-kb5001641-x64_ec0dc33ff8d0d0381eb3fe9595c8a96ccebf9e61.msu
# KB5001640 für Windows 8.1 x86
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows8.1-kb5001640-x86_149741dd2206faf42303dd7a6800567b681367be.msu
# KB5001640 für Windows 8.1 x64
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows8.1-kb5001640-x64_7aa82103f5e37a9d3c2ce2b608c903ed0855ac3b.msu
# KB5001640 für Windows Server 2012 R2
#       http://download.windowsupdate.com/d/msdownload/update/software/updt/2021/03/windows8.1-kb5001640-x64_7aa82103f5e37a9d3c2ce2b608c903ed0855ac3b.msu
# KB5001631 für Windows 10 1507 und Server 2016
# KB5001634 für Windows 10 1803 
# KB5001638 für Windows 10 1809 und Server 2019
# KB5001648 für Windows 10 1909
# KB5001649 für Windows 10 2004 und 20H2
# 
# fehlerhaft waren bisher die Updates KB5000802, KB5000808, KB5000822, KB5000809, KB5000812, KB5000803, KB5000807, KB5001567, KB5001566, KB5001568, KB5001565

Das Script kann hier heruntergeladen werden. Viel Erfolg. Übrigen: Für Dymo Labeldrucker, die auch von den Problemen betroffen waren, gibt der Hersteller folgenden Hinweis:

Dymo Labeldrucker


Anzeige

Dieser Beitrag wurde unter Problemlösung, Windows 10, Windows Server abgelegt und mit , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

3 Antworten zu Script V2 zur März 2021 Update-Bereinigung bei Druckproblemen

  1. 1ST1 sagt:

    Roter Text auf schwarzem Hintergrund, brrrr, da bekommt man ja Augenkrebs!

  2. Hans Thölen sagt:

    Mein Tintenstrahldrucker Epson L310 wird von Epson immer auf dem aktuellsten
    Stand gehalten. Mit diesem Drucker habe ich keine Probleme, und ich hatte nie
    Probleme beim Drucken. Ich habe mehrmals alle Szenarien durchgespielt, wo ein
    Problem auftreten könnte, aber mein Epson L310 druckt Alles, was ich ihm zum
    Drucken vorsetze.

  3. Sarek sagt:

    Das Update 5000802 wird leider bei der nächsten Suche nach Updates wieder gefunden und installiert – und verursacht weiterhin Probleme beim Graphikdruck. Wollte Microsoft das nicht zurückziehen?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Bitte beachtet die Regeln zum Kommentieren im Blog (Erstkommentare und Verlinktes landet in der Moderation, gebe ich alle paar Stunden frei, SEO-Posts/SPAM lösche ich rigoros). Kommentare abseits des Themas bitte unter Diskussion.

Du findest den Blog gut, hast aber Werbung geblockt? Du kannst diesen Blog auch durch eine Spende unterstützen.